package br.com.ecommerce.dao;

import br.com.ecommerce.dao.pojo.EntityPojo;
import br.com.ecommerce.exceptions.DatabaseException;
import br.com.ecommerce.exceptions.IdInvalidoException;
import br.com.ecommerce.exceptions.ObjetoInvalidoException;
import java.util.List;

/**
 * Interface que defini os métodos comuns de manipulação de entidades
 * @author afonso.alcantara
 */
public interface GenericDAO {

    /**
     * Método que recebe um POJO como parametro e o insere na base de dados
     * @param obj
     * @throws ObjetoInvalidoException
     */
    public void create(EntityPojo obj)
            throws ObjetoInvalidoException, DatabaseException;

    /**
     * Método que ler uma entidade a partir de uma chave primária
     * @param idPrimaryKey
     * @return
     * @throws IdInvalidoException
     * @throws ObjetoInvalidoException
     */
    public EntityPojo readById(Integer idPrimaryKey)
                                    throws IdInvalidoException,
                                            DatabaseException;

    /**
     * Método que ler e retornar uma lista com todos os registros da entidade
     * @return
     * @throws ObjetoInvalidoException
     */
    public List readAll() throws DatabaseException;

    /**
     * Método que deletar um registro a partir de uma chave primária
     * @param idPrimaryKey
     * @throws IdInvalidoException
     */
    public void deleteById(Integer idPrimaryKey)
                                    throws IdInvalidoException, DatabaseException;

    /**
     * Método que atualiza um registro
     * @param obj
     * @throws ObjetoInvalidoException
     */
    public void update(EntityPojo obj)
            throws ObjetoInvalidoException, DatabaseException;
}
